﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using skhukb.DB;

namespace skhukb.BL
{

    public class 로그기록관리
    {
        // 로그기록 구분
        const string 로그인 = "로그인";
        const string 로그인실패 = "로그인실패";
        const string 로그아웃 = "로그아웃";
        const string 계정생성 = "계정생성";

        private static void 기록(int 사용자ID, string 구분, string 내용)
        {
            using (var db = new DBDataContext()) {
                var n = new 로그기록 {
                    사용자ID = 사용자ID,
                    IP = HttpContext.Current.Request.UserHostAddress,
                    URL = HttpContext.Current.Request.Url.ToString(),
                    구분 = 구분,
                    일시 = DateTime.Now,
                    내용 = 내용
                };
                db.로그기록.InsertOnSubmit(n);
                db.SubmitChanges();
            }
        }

        public static void 계정생성_기록(int 사용자ID, string 로그인ID)
        {
            기록(사용자ID, 계정생성, 로그인ID);
        }

        public static void 로그인_기록(int 사용자ID)
        {
            기록(사용자ID, 로그인, 로그인);
        }

        public static void 로그인실패_기록(string id, string pw, string returnUrl)
        {
            기록(현재사용자.사용자.ID, 로그인실패, string.Format("ID:[{0}] PW:[{1}] ReturnURL:[{2}]", id, pw, returnUrl));
        }

        public static void 로그아웃_기록(int 사용자ID)
        {
            기록(사용자ID, 로그아웃, 로그아웃);
        }

        public static DateTime 최근로그아웃_조회(int 사용자ID)
        {
            const string KEY = "_최근로그아웃_";

            var temp = (DateTime?)HttpContext.Current.Session[KEY];
            if (temp == null) {
                using (var db = new DBDataContext()) {
                    var n = db.로그기록.Where(p => p.사용자ID == 사용자ID && p.구분 == 로그아웃)
                                   .OrderByDescending(p => p.ID).FirstOrDefault();
                    temp = (n == null) ? DateTime.Now : n.일시;
                    HttpContext.Current.Session[KEY] = temp;
                }
            }
            return temp.Value;
        }

        public static void 예외_기록(Exception e)
        {
            기록(현재사용자.사용자.ID, e.GetType().ToString(), e.Message + "\n" + e.StackTrace);
        }

        public static void 예외404_기록(string path)
        {
            기록(현재사용자.사용자.ID, "404", "요청된 path: " + path);
        }
    }

}
